home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / ln.c < prev    next >
C/C++ Source or Header  |  1990-07-15  |  1KB  |  65 lines

  1. /* ln - link a file        Author: Andy Tanenbaum */
  2.  
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5.  
  6. char name[256];
  7. struct stat stb;
  8.  
  9. main(argc, argv)
  10. int argc;
  11. char **argv;
  12. {
  13.   char *file1, *file2;
  14.   char *last_comp();
  15.  
  16.   if (argc < 2 || argc > 3) usage();
  17.   if (access(argv[1], 0) < 0) {
  18.     std_err("ln: cannot access ");
  19.     std_err(argv[1]);
  20.     std_err("\n");
  21.     exit(1);
  22.   }
  23.   if (stat(argv[1], &stb) >= 0 && (stb.st_mode & S_IFMT) == S_IFDIR) usage();
  24.   file1 = argv[1];
  25.  
  26.   /* "ln file" means "ln file ." */
  27.   if (argc == 2)
  28.     file2 = ".";
  29.   else
  30.     file2 = argv[2];
  31.  
  32.  
  33.  
  34.   /* Check to see if target is a directory. */
  35.   if (stat(file2, &stb) >= 0 && (stb.st_mode & S_IFMT) == S_IFDIR) {
  36.     strcpy(name, file2);
  37.     strcat(name, "/");
  38.     strcat(name, last_comp(file1));
  39.     file2 = name;
  40.   }
  41.   if (link(file1, file2)) {
  42.     std_err("ln: Can't link\n");
  43.     exit(1);
  44.   }
  45.   exit(0);
  46. }
  47.  
  48. char *last_comp(s)
  49. char *s;
  50. {
  51. /* Return pointer to last component of string. */
  52.   int n;
  53.   n = strlen(s);
  54.   while (n--)
  55.     if (*(s + n) == '/') return(s + n + 1);
  56.   return(s);
  57. }
  58.  
  59.  
  60. usage()
  61. {
  62.   std_err("Usage: ln file1 [file2]\n");
  63.   exit(1);
  64. }
  65.